﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using Helena.Models;

namespace Helena.Areas.Productos.Models
{
    public class LogicaProducto : InterfazLogicaProducto
    {
        DBContext Producto_contexto = new DBContext();
        DBGenericQueriesUtil<Producto> Tabla;
        DBGenericQueriesUtil<DetalleProducto> tabla_detalle;

        #region Comun
        
        public DBContext context_publico { get { return Producto_contexto; } }

        public LogicaProducto()
        {
            Tabla = new DBGenericQueriesUtil<Producto>(Producto_contexto, Producto_contexto.t_Productos);
            tabla_detalle = new DBGenericQueriesUtil<DetalleProducto>(Producto_contexto,Producto_contexto.t_DetalleProductos);
        }

        public void i_AgregarProducto(ProductoView p_v) 
        {
            Tabla.agregarElemento(p_v.deserializa(this));
        }

        public void i_ModificarProducto(ProductoView p_v) 
        {
            Producto P = p_v.deserializa(this);
            Tabla.modificarElemento(P, P.ID);
        }
        
        public void i_EliminarProducto(int id) 
        {
            Tabla.eliminarElemento_logico(id); 
        }
        
        public List<ProductoView> i_RetornarProductos() 
        {
            List<Producto> p = Tabla.retornarTodos();
            List<ProductoView> p_v = new List<ProductoView>();

            foreach (Producto producto in p) p_v.Add(new ProductoView(producto));
            return p_v;
        }
        
        public ProductoView i_RetornarProducto(int id) 
        {
            try
            {
                Producto p = Tabla.retornarUnSoloElemento(id);
                ProductoView p_v = new ProductoView(p);
                return p_v;
            }
            catch
            {
                return null;
            }
        }

        #endregion

        #region Detalles

        public List<DetalleProductoView> DetallesDeUnProducto(int productoID)
        {
            IEnumerable<DetalleProducto> antes = from detalles in tabla_detalle.retornarTodos()
                                                 where detalles.ProductoCID == productoID && detalles.Estado == true
                                                 select detalles;

            List<DetalleProducto> detallesDeUnProducto = antes.ToList();
            List<DetalleProductoView> salida = new List<DetalleProductoView>();

            foreach (DetalleProducto uno in detallesDeUnProducto)
                if (uno.Estado)
                {
                    DetalleProductoView temp = new DetalleProductoView(uno);
                    salida.Add(temp);
                }
            return salida;
        }

        public void AgregarDetalleaProducto(int ID, DetalleProductoView dpv)
        {
            bool pertenece=false;
            List<DetalleProducto> detalles = tabla_detalle.retornarTodos()
                                            .Where(d => d.ProductoCID == ID)
                                            .Where(d=>d.Estado==true)
                                            .ToList();
            
            foreach (DetalleProducto d in detalles)
            {
                if (d.ProductoID == dpv.ProductoSID)
                {
                    pertenece = true;
                }
            }

            if (pertenece == false)
            {
                tabla_detalle.agregarElemento(dpv.deserializa(this));
            }
        }

        public void i_ModificarDetalle(int ID, DetalleProductoView detalle) 
        {
            // se hace la definicion
            tabla_detalle.modificarElemento(detalle.deserializa(this), detalle.ID);
        }

        public void i_EliminarDetalle(int id, DetalleProductoView detalle)
        {
            tabla_detalle.eliminarElemento_logico(detalle.ID);
        }

        #endregion
    }
}